package func_example

import (
	"errors"
)

//  姿势1，声明一个函数类型，实现该类型（出入参一致）
type operation func(x int, y int) int
type operationFun func(x int, y int) (int, error)

func printToStd(x, y int) int {
	return x * y
}

//func main() {
//	var p Operation
//	p = printToStd
//	fmt.Println("结果：", p(1, 2))
//}

// 姿势2 接受其他函数作为参数传入
func calculate(x, y int, op operation) (int, error) {
	if op == nil {
		return 0, errors.New("invalid operation")
	}
	return op(x, y), nil
}

//func main() {
//	op := func(x int, y int) int {
//		return x * y
//	}
//	result, err := calculate(1, 2, op)
//	fmt.Println("结果：", result, err)
//}

// 姿势3 把其他函数作为结果返回（闭包函数）
func genCalculate(op operation) operationFun {
	return func(x, y int) (int, error) {
		if op == nil {
			return 0, errors.New("invalid operation")
		}
		return op(x, y), nil
	}
}

//func main() {
//	op := func(x int, y int) int {
//		return x + y
//	}
//	add := genCalculate(op)
//	result, err := add(1, 2)
//	fmt.Println("结果：", result, err)
//}
